package cn.iocoder.yudao.module.reading.util;

import cn.hutool.core.util.StrUtil;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;

/**
 * 社区参数校验工具类
 *
 * @author 芋道源码
 */
public class CommunityValidationUtils {

    // 支持的图片格式
    private static final List<String> SUPPORTED_IMAGE_TYPES = Arrays.asList(
            "image/jpeg", "image/jpg", "image/png", "image/gif", "image/bmp"
    );

    // 支持的图片扩展名
    private static final List<String> SUPPORTED_IMAGE_EXTENSIONS = Arrays.asList(
            "jpg", "jpeg", "png", "gif", "bmp"
    );

    // 敏感词正则（简单示例）
    private static final Pattern SENSITIVE_PATTERN = Pattern.compile(
            ".*(政治|暴力|色情|赌博|毒品).*", Pattern.CASE_INSENSITIVE
    );

    /**
     * 校验帖子内容
     *
     * @param content 帖子内容
     */
    public static void validatePostContent(String content) {
        // 允许内容为空（可以只发图片）
        if (StrUtil.isNotBlank(content)) {
            if (content.length() > 500) {
                throw exception(BAD_REQUEST, "帖子内容长度不能超过500个字符");
            }

            // 简单的敏感词检查（实际应该使用专业的敏感词库）
            if (SENSITIVE_PATTERN.matcher(content).matches()) {
                throw exception(BAD_REQUEST, "内容包含敏感词，请修改后重试");
            }
        }
    }

    /**
     * 校验帖子内容和图片（至少要有一个）
     *
     * @param content 帖子内容
     * @param images 图片列表
     */
    public static void validatePostContentAndImages(String content, List<String> images) {
        boolean hasContent = StrUtil.isNotBlank(content);
        boolean hasImages = images != null && !images.isEmpty();

        if (!hasContent && !hasImages) {
            throw exception(BAD_REQUEST, "帖子内容和图片不能同时为空");
        }

        // 验证内容
        if (hasContent) {
            validatePostContent(content);
        }

        // 验证图片
        if (hasImages) {
            validateImageList(images, 3);
        }
    }

    /**
     * 校验评论内容
     *
     * @param content 评论内容
     */
    public static void validateCommentContent(String content) {
        if (StrUtil.isBlank(content)) {
            throw exception(BAD_REQUEST, "评论内容不能为空");
        }

        if (content.length() > 300) {
            throw exception(BAD_REQUEST, "评论内容长度不能超过300个字符");
        }

        // 简单的敏感词检查
        if (SENSITIVE_PATTERN.matcher(content).matches()) {
            throw exception(BAD_REQUEST, "内容包含敏感词，请修改后重试");
        }
    }

    /**
     * 校验图片文件
     *
     * @param file 图片文件
     * @param maxSize 最大文件大小（字节）
     */
    public static void validateImageFile(MultipartFile file, long maxSize) {
        if (file == null || file.isEmpty()) {
            throw exception(BAD_REQUEST, "图片文件不能为空");
        }

        // 检查文件大小
        if (file.getSize() > maxSize) {
            throw exception(BAD_REQUEST,
                    String.format("图片文件大小不能超过%dMB", maxSize / 1024 / 1024));
        }

        // 检查文件类型
        String contentType = file.getContentType();
        if (StrUtil.isBlank(contentType) || !SUPPORTED_IMAGE_TYPES.contains(contentType.toLowerCase())) {
            throw exception(BAD_REQUEST, "不支持的图片格式，请上传JPG、PNG、GIF或BMP格式的图片");
        }

        // 检查文件扩展名
        String originalFilename = file.getOriginalFilename();
        if (StrUtil.isBlank(originalFilename)) {
            throw exception(BAD_REQUEST, "图片文件名不能为空");
        }

        String extension = getFileExtension(originalFilename).toLowerCase();
        if (!SUPPORTED_IMAGE_EXTENSIONS.contains(extension)) {
            throw exception(BAD_REQUEST, "不支持的图片格式，请上传JPG、PNG、GIF或BMP格式的图片");
        }
    }

    /**
     * 校验图片列表
     *
     * @param images 图片URL列表
     * @param maxCount 最大图片数量
     */
    public static void validateImageList(List<String> images, int maxCount) {
        if (images != null && images.size() > maxCount) {
            throw exception(BAD_REQUEST, String.format("最多只能上传%d张图片", maxCount));
        }
    }

    /**
     * 校验举报原因
     *
     * @param reason 举报原因
     */
    public static void validateReportReason(String reason) {
        if (StrUtil.isBlank(reason)) {
            throw exception(BAD_REQUEST, "举报原因不能为空");
        }

        if (reason.length() > 500) {
            throw exception(BAD_REQUEST, "举报原因长度不能超过500个字符");
        }
    }

    /**
     * 校验作品类型
     *
     * @param workType 作品类型
     */
    public static void validateWorkType(String workType) {
        if (StrUtil.isBlank(workType)) {
            throw exception(BAD_REQUEST, "作品类型不能为空");
        }

        if (!"book".equals(workType) && !"bookset".equals(workType)) {
            throw exception(BAD_REQUEST, "作品类型只能是book或bookset");
        }
    }

    /**
     * 校验帖子类型
     *
     * @param postType 帖子类型
     */
    public static void validatePostType(String postType) {
        if (StrUtil.isBlank(postType)) {
            throw exception(BAD_REQUEST, "帖子类型不能为空");
        }

        if (!"normal".equals(postType) && !"work".equals(postType)) {
            throw exception(BAD_REQUEST, "帖子类型只能是normal或work");
        }
    }

    /**
     * 校验ID参数
     *
     * @param id ID值
     * @param fieldName 字段名称
     */
    public static void validateId(Long id, String fieldName) {
        if (id == null || id <= 0) {
            throw exception(BAD_REQUEST, String.format("%s必须是正整数", fieldName));
        }
    }

    /**
     * 获取文件扩展名
     *
     * @param filename 文件名
     * @return 扩展名
     */
    private static String getFileExtension(String filename) {
        if (StrUtil.isBlank(filename)) {
            return "";
        }
        
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex == -1 || lastDotIndex == filename.length() - 1) {
            return "";
        }
        
        return filename.substring(lastDotIndex + 1);
    }

}
